from sqlalchemy import create_engine,MetaData
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker
from mysql.confing import *
#from mysql.data_handle import *

engine=create_engine(mysql_connection,encoding='utf8',max_overflow=10,pool_size=20,pool_recycle=60*60) #max_overflow为超过连接池后的最大连接数，pool_size为连接池数目，recycle为连接时间。
metadata = MetaData()
metadata.reflect(engine,only=['user','main'])
Base = automap_base(metadata=metadata)   # 表单自动映射
session = sessionmaker(bind=engine) # 订制会话
Base.prepare()

"""
===============================数据库接口mysql=====================================
有写入信息，查询用户，查询棋局，修改用户，删除用户功能。
"""


# class mysql():


# 写入信息函数
def db_insert(locations=None, win=None, username=None, ip=None):
    """
    1.summary:此函数为插入信息功能，执行插入信息功能
    2.return:True为数据库写入成功，False为数据库写入失败
    ========================main表单(记录棋局信息)===================================
    3.locations:此为判断完棋局下完后传入的所有棋子位置数据，默认为string类型
    4.win:此字段为赢的一方的信息，1代表黑棋，-1代表白棋，0代表和棋，默认int类型
    ========================user表单(记录用户信息)===================================
    5.username:用户访问页面时的用户名注册，默认String型
    6.ip:用户的ip信息，默认String型
    7.status:用户的在线状态，-1为离线，0代表在线且空闲,1代表在线且游戏中,默认首次登陆为0，int型

    """
    if locations and (win == 0 or win == 1):
        new=''
        for i in locations:
            new += str(i)+';'
        Main = Base.classes.main
        sess = session()
        print("正在写入新的棋局信息...")
        new = Main(locations=new,win=win)
        sess.add(new)
        sess.close()
        sess.commit()
        print("新的棋局信息写入成功！")
        return True
    elif username and ip:
        User = Base.classes.user
        sess= session()
        print("正在写入登陆用户信息...")
        new = User(username=username,ip=ip)
        sess.add(new)
        sess.commit()
        sess.close()
        print("用户登陆信息写入成功！")
        return  True
    else:
        print("数据格式错误！")
        return False


#  执行查询功能，查询user表单的用户信息。
def db_query_user(statu=False):
    """
    1.summary:此函数为查询用户信息的查询功能，可以通过指定param的值查询，默认返回用户名与状态的全部值，不查询ip。
    2.statu:此参数的值，0代表在线且空闲，1代表在线且游戏中,其他值代表获取全部数据，默认值为0。
    3.return:返回类型list，查询成功返回类型为列表。如list[(username1,status1),(username2,status2)]。
    """
    User = Base.classes.user
    sess=session()
    if statu == 1:
        print("正在查询正在游戏的用户信息...")
        user = sess.query(User.username,User.status).filter_by(status=1).all()
        sess.commit()
        try:
            a=user[0]
            print("查询成功！")
            return user
        except:
            print("数据库无用户游戏中信息！！！")
            return False
    elif statu == 0:
        print("正在查询空闲用户的信息...")
        user = sess.query(User.username,User.status).filter_by(status=0).all()
        sess.commit()
        try:
            a=user[0]
            print("查询成功！")
            return user
        except:
            print("查询失败，数据库不存在此信息！！！")
            return False
    else:
        print("正在查询全部用户信息...")
        user = sess.query(User.username,User.status).all()
        sess.commit()
        try:
            a=user[0]
            print("查询成功！")
            return user
        except:
            print("查询失败，数据库不存在此信息！！！")
            return False


# 执行查询功能，查询main表单的棋局数据信息。
def db_query_main(win=False):
    """
    1.summary:此函数为查询棋局信息，通过指定win即胜方查询条件来提取信息。
    2.win:此参数的值1代表黑棋，-1代表白棋，2代表和棋。通过指定参数可以分类数据。
    3.return:返回值类型为list。如list[(loactions1,win1),(locations2,win2)],其中locations以三元组方式储存如（1,2,1) 默认为String型
    """
    Main = Base.classes.main
    sess = session()
    if not win:
        print("正在查询全部棋局信息...")
        main = sess.query(Main.locations,Main.win).all()
        sess.commit()
        try:
            a = main[-1]
            print("查询成功！")
            return main
        except:
            print("查询失败！")
            return False
    elif win == 1:
        print("正在查询所有黑棋赢的信息...")
        main = sess.query(Main.locations,Main.win).filter_by(win=1).all()
        sess.commit()
        try:
            a=main[0]
            print("查询成功！")
            return main
        except:
            print("无黑棋赢的数据！！！")
            return False
    elif win == -1:
        print("正在查询所有白棋赢的信息...")
        main = sess.query(Main.locations,Main.win).filter_by(win=-1).all()
        sess.commit()
        try:
            a=main[0]
            print("查询成功！")
            return main
        except:
            print("无白棋赢的数据！！！")
            return False
    else:
        print("正在查询所有和棋的信息...")
        main = sess.query(Main.locations,Main.win).filter_by(win=2).all()
        sess.commit()
        try:
            a=main[0]
            print("查询成功！")
            return main
        except:
            print("无和棋的数据！！！")
            return False


# 此函数为实时更新用户的状态
def db_update_user(username=False,statu=False):
    """
1.summary:此函数主要更新每个在线用户的信息，当离线时删除用户信息
2.username:此参数唯一存在，不可重复，需要传入的类型为String
3.statu:此参数代表用户状态，如果离线了，请传入-1，用于实时删除数据
4.return:返回bool型，成功返回True，修改失败返回False
    """
    User = Base.classes.user
    sess = session()
    sel = sess.query(User).filter_by(username=username).first()
    if statu and sel is not None:
        sel.status = statu
        sess.commit()
        print("用户状态修改成功!")
        return True
    else:
        print("用户状态修改失败！")
        return False


# 此函数为删除离线用户个人信息
def db_delete_user():
    """
1.summary：此函数时用于删除离线个人信息，需在每次修改状态后实例化一次，且不做返回。
    """
    User = Base.classes.user
    sess = session()
    sel = sess.query(User).filter_by(status=-1).all()
    try:
        a=sel[0]
        for i in sel:
            sess.delete(i)
        sess.commit()
        print("离线用户删除成功！")
    except:
        print("无离线用户!")


#A=db_query_main(win=2)
#print(A)
#print(A)
#print(A[0][0])
# a=A[0][0]
# print(A[0][-1])
# B=mysql().db_query_user(statu=1)
# print(B[0][-1])
#C=mysql().db_delete_user()
#D=db_insert(locations=[[1,1,0],[2,2,1]],win=2)

#E=mysql().db_insert(username='张三',ip='192.168.1')

#F=mysql().db_update_user(username='张三',statu=1)
#G=mysql().db_delete_user()
